package com.suian.nettyserver;

import com.suian.utilhelper.MQHelper;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author suian
 * @date 2020/9/16 16:21
 */
public class GroupServerHandler extends SimpleChannelInboundHandler<String> {

    //定义一个channel组,管理所有的channel
    //GlobalEventExecutor是全局的事件执行器,是一个单例
    private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
    //显示时间
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //表示一旦连接,第一个执行的,将channel加入channelGroup中
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        //该方法会将channelGroup中所有的channel遍历,并发送消息,自己不需要遍历
        channelGroup.writeAndFlush("[设备]" + channel.remoteAddress() + " 加入服务器" + sdf.format(new Date()) + "\n");
        channelGroup.add(channel);
    }

    //读取数据
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        //获取当前的channel
        Channel channel = ctx.channel();
        //显示设备信息以及发送的消息
        String message="[设备]" + channel.remoteAddress() + " 发送了消息: " + msg + "\n";
        System.out.println(message);
        //将消息上传到MQ服务器
        MQHelper.sendMesssage(message);

//        //这时遍历channelGroup,根据不同的情况,回送不同的消息
//        channelGroup.forEach(ch -> {
//            if (channel != ch) {//不是当前的channel,转发消息
//                ch.writeAndFlush("[设备]" + channel.remoteAddress() + " 发送了消息" + msg + "\n");
//            } else {//回显自己发送的消息给自己
//                ch.writeAndFlush("[服务器]发送了消息" + msg + "\n");
//            }
//        });
    }

    //表示处于活跃状态,提示xx上线
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("[设备]"+ctx.channel().remoteAddress() + " 上线了---");
    }

    //表示不再活跃状态,提示离线
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("[设备]"+ctx.channel().remoteAddress() + " 离线了---");
    }


    //断开连接
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        channelGroup.writeAndFlush("[设备]" + channel.remoteAddress() + " 离开了\n");
        System.out.println(sdf.format(new Date())+" [当前设备数量]: " + channelGroup.size());
    }

    //错误处理
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
       //出现异常关闭通道
        ctx.close();
    }

}
